背景: API28,PhotoView+Viewpager
异常:
E AndroidRuntime: java.lang.IllegalArgumentException: pointerIndex out of range
E AndroidRuntime: at android.view.MotionEvent.nativeGetAxisValue(Native Method)
E AndroidRuntime: at android.view.MotionEvent.getX(MotionEvent.java:2205)
E AndroidRuntime: at androidx.viewpager.widget.ViewPager.onInterceptTouchEvent(ViewPager.java:2072)
E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2573)
E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
原因: 根据上面异常信息可以发现出错位置在ViewPager.java2072行ev.getX(pointerIndex)(如下),而这次的异常也就是其中的参数(pointerIndex)超出了范围导致,pointerIndex每次通过MotionEvent.findPointerIndex(activePointerId)来获取,在双指对图片进行双指缩放时,一个手指抬起,activePointerId却没有进行重新赋值,获取到值错误,就直接影响了pointerIndex,也就在这个时候出现了异常。
1 | @Override |
解决方案:
查阅了资料,比较简单明了的处理方法就是自定义Viewpager对ViewPager的onInterceptTouchEvent()进行try{}catch()操作。值得注意的是,在try{}catch()中直接return super.onInterceptTouchEvent(ev),图片会出现滑动异常,所以进行了如下的特殊处理。
1 | public class CustomViewPager extends ViewPager { |